We have moved our forum to GitHub Discussions. For questions about Phalcon v3/v4/v5 you can visit here and for Phalcon v6 here.

$user->create() breaks action if failed

Hello,

I'm having a model with a uniqueness validator, an action, and a view with a form, and everything is working fine, records get added etc, but whenever i try to add something to the database with $this->create() that already exists, or anything that makes the query fail, it's breaking the entire code leaving no error message.

When i wrap the following try/catch around $user->create(); in my controller

try {

$user->create();

} catch (\Exception $e) {
    echo get_class($e), ": ", $e->getMessage(), "\n";
    echo " File=", $e->getFile(), "\n";
    echo " Line=", $e->getLine(), "\n";
    echo $e->getTraceAsString();
}

..and add a record that already exists, i'm getting

Phalcon\Mvc\Model\ValidationFailed: Value of field 'username' is already present in another record 

Which is fine and expected.

However, without the try/catch, if i run the following code, neither "failed", nor "failed 2" are displayed. The code just breaks and nothing after the if() condition is executed, not even the echo 'failed 2';, leaving the action and the view form broken.

if($user->create())
        {
        echo 'success'; // not executed
        }
        else
        {
        echo 'failed';  // not executed
        }

echo 'failed 2';  // not executed

here is my model and the action in my controller:

use Phalcon\Mvc\Model\Validator\Uniqueness;

class Users extends Phalcon\Mvc\Model
{

    public function validation()
    {

        $this->validate(new Uniqueness(array(
            'field' => 'email',
            "message" => "Value of field 'email' is already present in another record"
        )));

        $this->validate(new Uniqueness(array(
            'field' => 'username',
            "message" => "Value of field 'username' is already present in another record"
        )));

        if ($this->validationHasFailed() == true) {
            return false;
        }
    }

    public function initialize() {

        /**
         *  Skip 'status' on insertion as it is a default value
         */
        $this->skipAttributesOnCreate(array('status'));
    }

}
public function registerAction() {
        $form = new RegisterForm();

        if ($this->request->isPost()) {
            if ($this->security->checkToken()) {
                if ($form->isValid($_POST)) {

                        $user = new Users;
                        $user->username =   $this->request->getPost('username');
                        $user->email =      $this->request->getPost('email');
                        $user->password =   $this->security->hash($this->request->getPost('password'));
                        $user->created_at = time();

                        if($user->create())
                            {
                            echo 'success';
                            }
                            else
                            {
                            echo 'failed'; // not executed if $user->create() fails
                            }

                        echo 'failed 2'; // not executed if $user->create() fails

                }
                else
                {
                    echo $form->getMessages()[0];
                }
            }
        }
        $this->view->form = $form;  // not executed if $user->create() fails (= breaks registration form)
    }

As you see there is also a $this->view->form = $form; at the end of the action - when the create() fails, this is neither executed, leaving the view broken with the following error message:

Fatal error: Call to a member function getLabel() on a non-object in C:\wamp\www\test.local\app\views\session\register.phtml on line 11

Is there anything i'm doing wrong? I don't really know what to do and i'm stuck with this for a while now

(i have created a topic about this two days ago but i failed at explaining my problem better and i don't know what to do and need to solve this quick)

Thanks for any replies



85.5k

and if you put var_dump($user->create());exit; before if($user->create()) ... what's the output ?

I think you might be getting some sort of mysql error or something like that .. you cna check just to sure the error log in your apache/nginx.

also make sure you display all the errors.

public/index.php

error_reporting(E_ALL);
ini_set('display_errors', 1);


3.8k

I can't believe it. I just found the following code in my public/index.php which was causing it

ini_set('phalcon.orm.exception_on_failed_save', true);

I don't remember why i've put this there. I'm going to hide in a corner now, thanks for your help izo, much appreciated :)